using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace offline2048
{
    public class UserLayerManager : MonoSingleton<UserLayerManager>
    {
        //Install转成 LowUser的条件
        
        public enum UserLayerType
        {
            None = 0,     // 0b0000
            Organic = 1,  // 0b0001
            Install = 2,  // 0b0010
            LowUser = 4   // 0b0100
        }

        // 每个元素是一个整数，用二进制位表示可转换的 buff
        // 例如，0b0000 表示 None 可以转换为 Organic、Install、LowUser
        //       0b0001 表示 Organic 不能转换为任何 buff
        //       0b0010 表示 Install 可以转换为 LowUser（条件满足）
        //       0b0100 表示 LowUser 可以转换为 Install（条件满足）
        private readonly int[] ConversionRules = new int[]
        {
            0b1110,  // None: 可以转换为 Organic、Install、LowUser (条件满足) 但不能转换为 None
            0b0001,  // Organic: 不能转换为任何 buff
            0b0010,  // Install: 可以转换为 LowUser（条件满足）
            0b0000   // LowUser: 可以转换为 Install（条件满足）
        };

        public bool ChangeUserLayer(UserLayerType userLayer)
        {
            UserLayerType currentUserLayer = GetCurrentUserLayer();
            if (CanConvert(currentUserLayer, userLayer))
            {
                PlayerPrefsManager.SetInt(PlayerPrefsManager.USER_LAYER_NAME, (int)userLayer);
                return true;
            }
            else
            {
                return false;
            }
        }

        public void ChangeUserLayerByGM(UserLayerType userLayer)
        {
            PlayerPrefsManager.SetInt(PlayerPrefsManager.USER_LAYER_NAME, (int)userLayer);
        }
        
        public UserLayerType GetCurrentUserLayer()
        {
            return (UserLayerType)PlayerPrefsManager.GetInt(PlayerPrefsManager.USER_LAYER_NAME, (int)UserLayerType.None);
        }

        public bool IsOrganic()
        {
            UserLayerType _type = GetCurrentUserLayer();
            return _type == UserLayerType.Organic;
        }

        public bool IsInstall()
        {
            return GetCurrentUserLayer() == UserLayerType.Install;
        }
        
        /// <summary>
        /// 检查是否可以从一个 buff 转换到另一个 buff
        /// </summary>
        /// <param name="currentBuff">当前的 buff 类型</param>
        /// <param name="targetBuff">目标的 buff 类型</param>
        /// <returns>是否可以转换</returns>
        private bool CanConvert(UserLayerType currentUserLayer, UserLayerType targetUserLayer)
        {
            /*int currentBuffIndex = (int)currentUserLayer;
            int targetBuffMask = 1 << (int)targetUserLayer;

            // 检查当前 buff 是否可以转换为目标 buff
            // 如果条件满足且目标 buff 在当前 buff 的转换规则中，返回 true
            return (ConversionRules[currentBuffIndex] & targetBuffMask) != 0;*/
            switch (currentUserLayer)
            {
                case UserLayerType.None:
                {
                    return true;
                }
                case UserLayerType.Organic:
                {
                    return false;
                }
                case UserLayerType.Install:
                {
                    if (targetUserLayer == UserLayerType.LowUser)
                    {
                        return true;
                    }
                    else 
                    {
                        return false;
                    }
                }
                case UserLayerType.LowUser:
                {
                    return false;
                }
            }

            return false;
        }

        public void CheckInstallToLowUser()
        {
            UserLayerType currentUserLayer = GetCurrentUserLayer();
            if (currentUserLayer == UserLayerType.Install)
            {
                int _noCmCount = PlayerPrefsManager.GetInt(PlayerPrefsManager.USER_NO_AD_TEN_TIMES);
                _noCmCount++;
                if (_noCmCount >= 10)
                {
                    ChangeUserLayer(UserLayerType.LowUser);
                }
            }
        }

        public void ReSetInstallToLowUser()
        {
            PlayerPrefsManager.ReSetInt(PlayerPrefsManager.USER_NO_AD_TEN_TIMES);
        }
    }
    
}